package generic;


/**
 * @description: 泛型类在继承情况下8种定义
 * @author: apple
 * @date:  2021/12/25 1:02 下午
 * @version 1.0
 **/
public class Father<T1,T2> {

    protected void add(T1 a,T2 b) {

        System.out.println(a.getClass() + "\t" + a);
        System.out.println(b.getClass() + "\t" + b);
    }

    protected <A,B> void my(A a , B b) {
        System.out.println(a.getClass() + "\t" + a);
        System.out.println(b.getClass() + "\t" + b);
    }
}

// 情况1：子类不保留父类的泛型，同时也不指定父类的泛型是那种类型
// 不保留，就等于编译器做了擦除，等价class Son1 extends Father<Object,Object>
// 注意：Son1不是泛型类
// 记忆：没有类型
class Son1 extends Father {

}
// 情况2：子类不保留父类的泛型，但指定了父类泛型的具体类型
// 注意：Son2也不是泛型类
// 记忆：具体类型
class Son2 extends Father<Integer , String> {

}
// 情况3：子类全部保留父类的泛型，但都不指定父类的泛型是那种类型
// 注意：Son3已经是泛型类，Son3的T1传递给Father的T1,Son3的T2传递给Father的T2,
// 记忆：全部保留
class Son3<T1 , T2> extends Father<T1 , T2> {

}

// 情况4：子类保留父类的一部分泛型，同时也指定部分父类的泛型类型
// 注意：Son4已经是泛型类，Son3的T1传递给Father的T1
// 记忆：部分保留
class Son4<T1> extends Father<T1,String> {

}

// 没有类型，等价：class Son1 extends Father<Object,Object>
class Son5<T1, T2> extends Father {

    public void show(T1 a, T2 b) {
        System.out.println("Son5");
        System.out.println(a.getClass() + "\t" + a);
        System.out.println(b.getClass() + "\t" + b);
    }
}

// 具体类型
class Son6<T1, T2> extends Father<Integer,Double> {
    public void show(T1 a, T2 b) {
        System.out.println("Son5");
        System.out.println(a.getClass() + "\t" + a);
        System.out.println(b.getClass() + "\t" + b);
    }
}

// 全部保留
class Son7<T1 , T2 , A , B> extends Father<T1 , T2> {

    protected void show(T1 a, T2 b , A aa , B bb) {
        System.out.println("Son5");
        System.out.println(a.getClass() + "\t" + a);
        System.out.println(b.getClass() + "\t" + b);
        System.out.println(a.getClass() + "\t" + aa);
        System.out.println(b.getClass() + "\t" + bb);
    }

}

// 部分保留
class Son8<T1 , A , B> extends Father<T1 , Integer> {

}
